ডাইনামিক মেমোরি অ্যালোকেশন (Dynamic Memory Allocation) হলো সেই প্রক্রিয়া, যার মাধ্যমে প্রোগ্রাম রানটাইমে (প্রোগ্রাম চলাকালীন) মেমোরি বরাদ্দ এবং মুক্ত করতে পারে। সি প্রোগ্রামিং ভাষায় ডাইনামিক মেমোরি অ্যালোকেশন প্রয়োজন হয় যখন আমরা পূর্বনির্ধারিত মেমোরি সীমাবদ্ধতার বাইরে গিয়ে ডেটা সংগ্রহ বা স্টোর করতে চাই। এই প্রক্রিয়ায় মেমোরি স্ট্যাকের পরিবর্তে হিপ (heap) থেকে বরাদ্দ করা হয়।
১. রানটাইমে মেমোরি বরাদ্দ: প্রোগ্রাম চলাকালীন সময়ে ডেটার আকার অনুযায়ী মেমোরি বরাদ্দ করতে হলে ডাইনামিক মেমোরি অ্যালোকেশন ব্যবহার করতে হয়। উদাহরণস্বরূপ, যদি ইউজার ইনপুটের উপর ভিত্তি করে মেমোরি বরাদ্দ করতে হয়, তবে ডাইনামিক মেমোরি অ্যালোকেশন প্রয়োজন।
২. মেমোরি ব্যবহারের কার্যকারিতা বৃদ্ধি: ডাইনামিক মেমোরি বরাদ্দের মাধ্যমে প্রয়োজন অনুযায়ী মেমোরি বরাদ্দ এবং মুক্ত করে মেমোরি ব্যবহারের কার্যকারিতা বাড়ানো যায়। ফলে প্রোগ্রামের কার্যক্ষমতা উন্নত হয়।
৩. আনলিমিটেড ডেটা স্টোরেজ: পূর্বনির্ধারিত মেমোরি সীমাবদ্ধতা ছাড়িয়ে বেশি ডেটা সংরক্ষণের প্রয়োজন হলে ডাইনামিক মেমোরি অ্যালোকেশন ব্যবহার করা হয়।
সি ভাষায় ডাইনামিক মেমোরি অ্যালোকেশনের জন্য stdlib.h
হেডার ফাইলে থাকা কিছু গুরুত্বপূর্ণ ফাংশন ব্যবহার করা হয়। নিচে এই ফাংশনগুলোর বর্ণনা দেওয়া হলো।
malloc()
– মেমোরি বরাদ্দ করাmalloc()
ফাংশনটি নির্দিষ্ট আকারের মেমোরি ব্লক বরাদ্দ করে এবং একটি পয়েন্টার রিটার্ন করে যা বরাদ্দকৃত মেমোরি ব্লকের শুরুতে নির্দেশ করে। malloc()
ফাংশনটি বরাদ্দকৃত মেমোরিকে নির্দিষ্ট করে না, তাই এতে যেকোনো পূর্বের মান থাকতে পারে।
সিঙ্কট্যাক্স:
void *malloc(size_t size);
উদাহরণ:
int *arr = (int *)malloc(5 * sizeof(int)); // ৫টি ইন্টিজার জন্য মেমোরি বরাদ্দ
calloc()
– শূন্য-মেমোরি বরাদ্দcalloc()
ফাংশনটি নির্দিষ্ট আকার এবং সংখ্যক মেমোরি ব্লক বরাদ্দ করে এবং বরাদ্দকৃত মেমোরিকে শূন্য দিয়ে পূর্ণ করে।
সিঙ্কট্যাক্স:
void *calloc(size_t num, size_t size);
উদাহরণ:
int *arr = (int *)calloc(5, sizeof(int)); // ৫টি ইন্টিজার জন্য শূন্য-মেমোরি বরাদ্দ
realloc()
– মেমোরি পুনরায় বরাদ্দrealloc()
ফাংশনটি পূর্বে বরাদ্দকৃত মেমোরি ব্লকের আকার পরিবর্তন করতে ব্যবহৃত হয়। এটি পূর্ববর্তী মেমোরি ব্লকের উপরে একটি নতুন আকারের মেমোরি বরাদ্দ করে এবং পূর্ববর্তী ডেটাকে সংরক্ষণ করে।
সিঙ্কট্যাক্স:
void *realloc(void *ptr, size_t new_size);
উদাহরণ:
arr = (int *)realloc(arr, 10 * sizeof(int)); // মেমোরি ব্লককে ১০টি ইন্টিজারে বাড়ানো
free()
– মেমোরি মুক্ত করাfree()
ফাংশনটি ডাইনামিক্যালি বরাদ্দকৃত মেমোরি ব্লককে মুক্ত করতে ব্যবহৃত হয়। এটি মেমোরি লিক প্রতিরোধ করে এবং সিস্টেমে মেমোরি পুনরায় ব্যবহারযোগ্য করে তোলে।
সিঙ্কট্যাক্স:
void free(void *ptr);
উদাহরণ:
free(arr); // মেমোরি মুক্ত করা
নিচে একটি উদাহরণ দেওয়া হলো, যেখানে ডাইনামিক মেমোরি বরাদ্দ করে ব্যবহার করা হয়েছে:
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
printf("Enter the number of elements: ");
scanf("%d", &n);
int *arr = (int *)malloc(n * sizeof(int)); // ডাইনামিক মেমোরি বরাদ্দ
if (arr == NULL) {
printf("Memory allocation failed\n");
return 1;
}
// মেমোরি ব্যবহার
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
// আউটপুট প্রদর্শন
printf("Array elements: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
free(arr); // মেমোরি মুক্ত করা
return 0;
}
১. মেমোরি লিক: ডাইনামিক মেমোরি বরাদ্দের পরে free()
ব্যবহার করে মেমোরি মুক্ত না করলে মেমোরি লিক হতে পারে, যা সিস্টেমের কার্যকারিতা কমিয়ে দেয়।
২. মেমোরি বরাদ্দ ব্যর্থতা: ডাইনামিক মেমোরি বরাদ্দের সময় মেমোরি বরাদ্দ ব্যর্থ হতে পারে। তাই প্রতিটি বরাদ্দের পরে NULL
পয়েন্টার চেক করা জরুরি।
৩. অতিরিক্ত ব্যবহার: বরাদ্দকৃত মেমোরির বাইরে অ্যাক্সেস করার চেষ্টা করলে প্রোগ্রাম ক্র্যাশ হতে পারে। বরাদ্দকৃত মেমোরির আকারের বাইরে ডেটা অ্যাক্সেস করা থেকে বিরত থাকা উচিত।
ডাইনামিক মেমোরি অ্যালোকেশন সি প্রোগ্রামিংয়ে প্রয়োজনীয় মেমোরি বরাদ্দ এবং মুক্ত করার ক্ষমতা দেয়, যা প্রোগ্রামিংকে আরও কার্যকরী এবং ব্যবহারকারী বান্ধব করে তোলে। malloc()
, calloc()
, realloc()
, এবং free()
ফাংশন ব্যবহার করে প্রোগ্রামাররা প্রোগ্রামের মেমোরি ব্যবস্থাপনা আরও দক্ষতার সাথে করতে পারেন।
common.read_more